Python MQTT v5.0 async client

Overview

PyPI version Build Status codecov

gmqtt: Python async MQTT client implementation.

Installation

The latest stable version is available in the Python Package Index (PyPi) and can be installed using

pip3 install gmqtt

Usage

Getting Started

Here is a very simple example that subscribes to the broker TOPIC topic and prints out the resulting messages:

import asyncio
import os
import signal
import time

from gmqtt import Client as MQTTClient

# gmqtt also compatibility with uvloop  
import uvloop
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())


STOP = asyncio.Event()


def on_connect(client, flags, rc, properties):
    print('Connected')
    client.subscribe('TEST/#', qos=0)


def on_message(client, topic, payload, qos, properties):
    print('RECV MSG:', payload)


def on_disconnect(client, packet, exc=None):
    print('Disconnected')

def on_subscribe(client, mid, qos, properties):
    print('SUBSCRIBED')

def ask_exit(*args):
    STOP.set()

async def main(broker_host, token):
    client = MQTTClient("client-id")

    client.on_connect = on_connect
    client.on_message = on_message
    client.on_disconnect = on_disconnect
    client.on_subscribe = on_subscribe

    client.set_auth_credentials(token, None)
    await client.connect(broker_host)

    client.publish('TEST/TIME', str(time.time()), qos=1)

    await STOP.wait()
    await client.disconnect()


if __name__ == '__main__':
    loop = asyncio.get_event_loop()

    host = 'mqtt.flespi.io'
    token = os.environ.get('FLESPI_TOKEN')

    loop.add_signal_handler(signal.SIGINT, ask_exit)
    loop.add_signal_handler(signal.SIGTERM, ask_exit)

    loop.run_until_complete(main(host, token))

MQTT Version 5.0

gmqtt supports MQTT version 5.0 protocol

Version setup

Version 5.0 is used by default. If your broker does not support 5.0 protocol version and responds with proper CONNACK reason code, client will downgrade to 3.1 and reconnect automatically. Note, that some brokers just fail to parse the 5.0 format CONNECT packet, so first check manually if your broker handles this properly. You can also force version in connect method:

from gmqtt.mqtt.constants import MQTTv311
client = MQTTClient('clientid')
client.set_auth_credentials(token, None)
await client.connect(broker_host, 1883, keepalive=60, version=MQTTv311)

Properties

MQTT 5.0 protocol allows to include custom properties into packages, here is example of passing response topic property in published message:

TOPIC = 'testtopic/TOPIC'

def on_connect(client, flags, rc, properties):
    client.subscribe(TOPIC, qos=1)
    print('Connected')

def on_message(client, topic, payload, qos, properties):
    print('RECV MSG:', topic, payload.decode(), properties)

async def main(broker_host, token):
    client = MQTTClient('asdfghjk')
    client.on_message = on_message
    client.on_connect = on_connect
    client.set_auth_credentials(token, None)
    await client.connect(broker_host, 1883, keepalive=60)
    client.publish(TOPIC, 'Message payload', response_topic='RESPONSE/TOPIC')

    await STOP.wait()
    await client.disconnect()
Connect properties

Connect properties are passed to Client object as kwargs (later they are stored together with properties received from broker in client.properties field). See example below.

  • session_expiry_interval - int Session expiry interval in seconds. If the Session Expiry Interval is absent the value 0 is used. If it is set to 0, or is absent, the Session ends when the Network Connection is closed. If the Session Expiry Interval is 0xFFFFFFFF (max possible value), the Session does not expire.
  • receive_maximum - int The Client uses this value to limit the number of QoS 1 and QoS 2 publications that it is willing to process concurrently.
  • user_property - tuple(str, str) This property may be used to provide additional diagnostic or other information (key-value pairs).
  • maximum_packet_size - int The Client uses the Maximum Packet Size (in bytes) to inform the Server that it will not process packets exceeding this limit.

Example:

client = gmqtt.Client("lenkaklient", receive_maximum=24000, session_expiry_interval=60, user_property=('myid', '12345'))
Publish properties

This properties will be also sent in publish packet from broker, they will be passed to on_message callback.

  • message_expiry_interval - int If present, the value is the lifetime of the Application Message in seconds.
  • content_type - unicode UTF-8 Encoded String describing the content of the Application Message. The value of the Content Type is defined by the sending and receiving application.
  • user_property - tuple(str, str)
  • subscription_identifier - int (see subscribe properties) sent by broker
  • topic_alias - int First client publishes messages with topic string and kwarg topic_alias. After this initial message client can publish message with empty string topic and same topic_alias kwarg.

Example:

def on_message(client, topic, payload, qos, properties):
    # properties example here: {'content_type': ['json'], 'user_property': [('timestamp', '1524235334.881058')], 'message_expiry_interval': [60], 'subscription_identifier': [42, 64]}
    print('RECV MSG:', topic, payload, properties)

client.publish('TEST/TIME', str(time.time()), qos=1, retain=True, message_expiry_interval=60, content_type='json')
Subscribe properties
  • subscription_identifier - int If the Client specified a Subscription Identifier for any of the overlapping subscriptions the Server MUST send those Subscription Identifiers in the message which is published as the result of the subscriptions.

Reconnects

By default, connected MQTT client will always try to reconnect in case of lost connections. Number of reconnect attempts is unlimited. If you want to change this behaviour, do the following:

client = MQTTClient("client-id")
client.set_config({'reconnect_retries': 10, 'reconnect_delay': 60})

Code above will set number of reconnect attempts to 10 and delay between reconnect attempts to 1min (60s). By default reconnect_delay=6 and reconnect_retries=-1 which stands for infinity. Note that manually calling await client.disconnect() will set reconnect_retries for 0, which will stop auto reconnect.

Asynchronous on_message callback

You can define asynchronous on_message callback. Note that it must return valid PUBACK code (0 is success code, see full list in constants)

async def on_message(client, topic, payload, qos, properties):
    pass
    return 0

Other examples

Check examples directory for more use cases.

Comments
  • GMQTT with TLS: Not able to connect to broker #122

    GMQTT with TLS: Not able to connect to broker #122

    TLS option is not working as expected. I'm new to this so trying to generate the certificates through this link : https://www.engineersgarage.com/tutorials/secure-client-server-communication-over-tls-security-protocol-using-mosquitto-broker-iot-part-42/ and copied the mosquitto_client.crt and mosquitto_client.key in mosquitto folder.

    Configuration in my code, using gmqtt:

        sub_client = MQTTClient(client_id='test')
        ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
        ssl_context.load_cert_chain('D:\Project\kiwee_action\mosquitto\certs\mosquitto_client.crt',
                                    keyfile='D:\Project\kiwee_action\mosquitto\certs\mosquitto_client.key')
        self.assign_callbacks_to_client(sub_client)
        logging.info("connecting")
        await sub_client.connect(host=config.37c16a79d00a, port=8883, ssl=ssl_context)
        return sub_client
    

    Issue: No error, but it is not able to connect to broker, If I remove this ssl part then it is working I am able to connect and publish the messages.

    Am I generating the mosquitto cert wrongly? Do we have to add some other files to mosuqitto.conf file Taking reference from this : https://github.com/wialon/gmqtt/issues/77

    opened by nitinkothari17 15
  • Connection lost on Linux server

    Connection lost on Linux server

    Hi,

    I am getting connect/disconnect events all the time on my Linux (debian) server. The same script works ok on my local machine (mac). The pattern is always the same, like:

    CONNECTED->SUBSCRIBED->CONN CLOSE NORMALLY/DISONNECT after exactly 4 minutes->CONNECTED->CONN CLOSE NORMALLY/DISONNECT after exactly 2 minutes. Then it repeats every 2 minutes many times, then again 4 minutes/2 minutes.

    I don't find anything in my server logs and there is only "503: mqtt session connection was closed (Unexpected disconnect)" message logged on flespi platform.

    Any clue on what this could be? Probably some server/network related stuff but don't know how to identify it I am attaching the screenshot from my terminal.

    Thx on any help that could help me resolve this.

    regards, dejan Screenshot 2020-03-18 at 15 39 41

    opened by dgambin 12
  • Remove double check for keepalive

    Remove double check for keepalive

    (at least on MacOS) the call_later-target is executed some milliseconds before the set timeout and therefore the ping will not be sent in a valid time for the broker.

    Explanation: For example: if keepalive is set to 2 seconds timeout, the call will eventually be made after 1.91(+-) seconds. Thus, the first call comes in after 1.91 seconds and the comparison if time.monotonic() - self._last_data_in >= self._keepalive will evaluate to false. The second call will be made after 3.92 seconds - but its already too late to send the ping to the broker then, because the maximum tolerance on broker-side is 1.5 * keepalive.

    As the timeout for call_later is already equal to keepalive, we can simply remove the double check inside the _keep_connection to have everything worky.

    opened by Dirk007 7
  • Asynchronous handlers

    Asynchronous handlers

    Is there any plan to switch to asynchronous handlers?

    I'd like to use an asynchronous function to store messages to a database using asyncio:

    async def on_message(client, topic, payload, qos, properties):
        pass
    
    mqtt_client.on_message = on_message
    

    Indeed it is still possible to add a new task to the event loop; I just thought it would be nicer.

    opened by DurandA 7
  • Handler does not work for null body retained messages published before the handler created

    Handler does not work for null body retained messages published before the handler created

    Handler does not work for null body retained messages published before the handler created. One service publishes null body messages with retaining True. Another service started later and its handlers don't react only on null-body retained messages. With other kinds of messages, everything is ok and Handlers catch it successfully. Maybe I should add some specific parameters for that case?

    opened by freemansgit 6
  • Topic Alias support?

    Topic Alias support?

    First of all, congrats to the developers on this great project, gmqtt is a joy a to use. Thanks!

    I had a quick look and it seems that Topic Alias are not supported by gmqtt. Is that the case? I will happily send a PR improving the docs if they are already supported, just couldn't see how.

    opened by pablogamboa 6
  • Reference to asyncio in synchronous method gmqtt.client.Client.publish

    Reference to asyncio in synchronous method gmqtt.client.Client.publish

    There is a wrong line in the publish() method of the client:

    https://github.com/wialon/gmqtt/blob/c167583682b38590a9770b8120662295d81c9c16/gmqtt/client.py#L195

    which causes failures in my code:

    2019-06-06 10:26:48,687 [ERROR] connectors.printer_input: Traceback (most recent call last):
    ...
      File "/home/rkrell/work/project/site-packages/syncasync.py", line 120, in thread_handler
        return self.func(*args, **kwargs)
      File "/home/rkrell/work/project/site-packages/gmqtt/client.py", line 195, in publish
        loop = asyncio.get_event_loop()
      File "/home/rkrell/work/project/pypy3.5-7.0.0-linux_x86_64-portable/lib-python/3/asyncio/events.py", line 671, in get_event_loop
        return get_event_loop_policy().get_event_loop()
      File "/home/rkrell/work/project/pypy3.5-7.0.0-linux_x86_64-portable/lib-python/3/asyncio/events.py", line 583, in get_event_loop
        % threading.current_thread().name)
    RuntimeError: There is no current event loop in thread 'Thread-1'.
    
    

    Since this line has no effect it should be removed from this synchronous function.

    opened by rkrell 6
  • GMQTT with TLS: ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed

    GMQTT with TLS: ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed

    TLS option is not working as expected. I can only set ssl to True but I cannot provide a path to the cert file. Mosquitto configuration is working ok with TLS both publisher and subscriber:

    mosquitto_sub --cafile /etc/mosquitto/ca_certificates/ca.crt -h 37c16a79d00a -t 'test' -p 8883 -u report -P 'report'
    
    
    mosquitto_pub --cafile /etc/mosquitto/ca_certificates/ca.crt -h 37c16a79d00a -t 'test' -m 'amessage' -p 8883 -u report -P 'report'
    
    
    mosquitto -v -c /etc/mosquitto/mosquitto.conf
    
    1575295867: New client connected from 172.17.0.3 as mosq-W7nvl4LtsfAVItCtHT (p2, c1, k60, u'report').
    1575295867: Client mosq-W7nvl4LtsfAVItCtHT disconnected.
    1575295870: New connection from 172.17.0.3 on port 8883.
    

    If I try to apply same configuration for gmqtt I get the error on the title

    # EXAMPLE
    import asyncio
    
    from gmqtt import Client
    
    
    async def main():
        cli = Client(client_id='test',
                     will_message=None,
                     clean_session=True)
        cli.set_auth_credentials('report', password='report')
        await cli.connect(host='37c16a79d00a',
                          port=8883,
                          keepalive=True,
                          ssl=True)
    
    if __name__ == '__main__':
        loop = asyncio.get_event_loop()
        loop.run_until_complete(main())
    
    

    ERROR FILE

    gmqtt/mqtt/connection.py

    ERROR LINE

    transport, protocol = await loop.create_connection(MQTTProtocol, host, port, ssl=ssl)

    ERROR MESSAGE

    ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1076)

    I would like to know how to implement TLS over gmqtt. Could you provide a quick example? Thanks

    opened by nicoCalvo 5
  • Use gmqtt without uvlo

    Use gmqtt without uvlo

    I just installed gmqtt but uvloop does not support Windows at the moment.

    Can I use gmqtt without uvloop?

    In the example, there is this comment: 'gmqtt also compatibility with uvloop' What does it mean? Is it a dependency or a choice?

    best regards

    opened by simonegiacomelli 5
  • Client does not reconnect

    Client does not reconnect

    Hi,

    I'm using version 0.5.6 and got the following code:

    #!/usr/bin/env python3
    
    import asyncio
    from gmqtt import Client as MQTTClient
    from gmqtt.mqtt.constants import UNLIMITED_RECONNECTS
    import logging
    
    logging.basicConfig(level=logging.DEBUG)
    
    async def main():
        mqtt = MQTTClient('tester')
    
        mqtt.set_config({
            'reconnect_retries': UNLIMITED_RECONNECTS,
            'reconnect_delay': 1
        })
    
        await mqtt.connect('localhost')
    
        while True:
            #if mqtt.is_connected:
            mqtt.publish('ohlc_1m', 'check')
            await asyncio.sleep(1)
    
    def handle_exception(loop, context):
        # context["message"] will always be there; but context["exception"] may not
        msg = context.get("exception", context["message"])
        logging.error(f"Caught exception: {str(msg)}")
    
    loop = asyncio.get_event_loop()
    loop.set_exception_handler(handle_exception)
    loop.run_until_complete(main())
    

    To test the reconnection I'm restarting mosquitto service and get the following output:

    DEBUG:asyncio:Using selector: EpollSelector
    INFO:gmqtt.mqtt.protocol:[CONNECTION MADE]
    DEBUG:gmqtt.mqtt.handler:[CMD 0x20] b'\x00\x00\x03"\x00\n'
    DEBUG:gmqtt.mqtt.handler:[CONNACK] flags: 0x0, result: 0x0
    DEBUG:gmqtt.client:[QoS query IS EMPTY]
    DEBUG:gmqtt.mqtt.package:Sending PUBLISH (q0), 'ohlc_1m', ... (5 bytes)
    DEBUG:gmqtt.mqtt.package:Sending PUBLISH (q0), 'ohlc_1m', ... (5 bytes)
    DEBUG:gmqtt.mqtt.protocol:[RECV EMPTY] Connection will be reset automatically.
    INFO:gmqtt.mqtt.protocol:[CONN CLOSE NORMALLY]
    DEBUG:gmqtt.mqtt.handler:[CMD 0xe0] b''
    DEBUG:gmqtt.mqtt.package:Sending PUBLISH (q0), 'ohlc_1m', ... (5 bytes)
    Traceback (most recent call last):
      File "test.py", line 32, in <module>
        loop.run_until_complete(main())
      File "/usr/lib/python3.8/asyncio/base_events.py", line 612, in run_until_complete
        return future.result()
      File "test.py", line 22, in main
        mqtt.publish('ohlc_1m', 'check')
      File "/usr/lib/python3.8/site-packages/gmqtt/client.py", line 228, in publish
        mid, package = self._connection.publish(message)
      File "/usr/lib/python3.8/site-packages/gmqtt/mqtt/connection.py", line 54, in publish
        return self._protocol.send_publish(message)
      File "/usr/lib/python3.8/site-packages/gmqtt/mqtt/protocol.py", line 111, in send_publish
        self.write_data(pkg)
      File "/usr/lib/python3.8/site-packages/gmqtt/mqtt/protocol.py", line 45, in write_data
        if not self._transport.is_closing():
    AttributeError: 'NoneType' object has no attribute 'is_closing'
    

    I've seen a similar error in #74 so reporting this one for further investigation.

    opened by naquad 4
  • restore subscriptions after connection lost

    restore subscriptions after connection lost

    Hi, I'm facing an issue when restoring subscriptions after a lost connection. I'm testing durability of connections and whenever I shut the connection down (turning the access point off) gmqtt reconnects and delivers messages but the subscriptions remain dead.

    I see two of the following log messages right after each other:

    INFO:mqtt.MQTTClient:MQTT connected
    INFO:gmqtt.mqtt.protocol:[CONN CLOSE NORMALLY]
    WARNING:gmqtt.mqtt.handler:[EXC OCCURED] in reconnect future None
    

    A little later:

    INFO:gmqtt.mqtt.protocol:[CONNECTION MADE]
    WARNING:gmqtt.mqtt.handler:[EXC OCCURED] in reconnect future None
    

    Any idea on how to either verify subscriptions and resubscribe in case a subscription is lost or how to make subscriptions more robust?

    opened by HerrMuellerluedenscheid 4
  • Newer example code

    Newer example code

    This PR provides a new revision of the sample code that has a few key features:

    • construct the gmqtt.Client() outside of the run loop
    • graceful shutdown of the client, and clearing of all tasks so that loop.close() does not throw errors
    • switch to .run_forever() instead of the singular gmqtt task, providing an example for other tasks to run in the same event loop
    • removal of the STOP event, in favor of the loop's built-in stopping mechanism
    opened by gstein 0
  • No PubBack Message

    No PubBack Message

    i have an application with google-iot-core Google iot-core allows you to have A gateway with multiple devices The gateway is the Client. To be able the multiples devices to communicate thought gateway with the google-broker its need to publish a specific attach message to google-iot-core broker, after that you can subscribe as device in the broker The problem is gmqtt doesnt return PubBack message when i publish the attach message so i dont know if the attach has been complete succesfull to continue with the logic

    opened by bambachas 0
  • publish() and then disconnect() may result in messages not received by a broker

    publish() and then disconnect() may result in messages not received by a broker

    Hi.

    We have such code (simplified): client = MQTTClient(instance_name, session_expiry_interval=0, clean_session=True) await client.connect(broker_addr) client.publish("theMessage", qos=1, retain=True) # we possibly send here much more messages await asyncio.sleep(4) # wait for publish msgs to be sent; 2 secs is not enough, 4 is enough (update: or not) await client.disconnect() sys.exit(0)

    problem is with the sleep; without the sleep, "theMessage" (and/or subsquently sent messsages) is not received by the broker. Recently, sleep with even 4 seconds is not enough. Is there a better way to wait for the queued messages to be received by the broker, before making a disconnect?

    opened by dawcal 0
  • I can't to use ca.crt, client.crt, client.key (X509 certificate) to connect mqtt broker.

    I can't to use ca.crt, client.crt, client.key (X509 certificate) to connect mqtt broker.

    Hi everyone

    I want to use ca.crt, client.crt, client.key to connect mqtt broker.

    My code like following:

        client = MQTTClient(clientId)
        print("Before ", client.is_connected)
        contextInstance = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
        contextInstance.load_default_certs()
        contextInstance.load_verify_locations(cafile=tls_CERT_PATH, cadata=None, capath=None)
        contextInstance.verify_mode =ssl.CERT_REQUIRED
        contextInstance.load_cert_chain(certfile=tls_CLIENT_PATH, keyfile=tls_CLIENTKEY_PATH)
        contextInstance.check_hostname=False
        result = await client.connect(host=broker,port=port,ssl=contextInstance)
        print("Result ", result)
        print("client.is_connected ", client.is_connected)
    

    And the execute result is:

    Before  False
    

    The execute is stop at the following line code

    result = await client.connect(host=broker,port=port,ssl=contextInstance)
    

    Can someone tell me how to fix it?

    Thanks for your watching and any idea.

    The X509 certificate file content is: ca.crt -> Just a ca certificate. Content as following

    -----BEGIN CERTIFICATE-----
    content message
    -----END CERTIFICATE-----
    

    client.crt -> Just a client certificate. Content as following

    -----BEGIN CERTIFICATE-----
    content message
    -----END CERTIFICATE-----
    

    client.key -> Just a client key. Content as following

    -----BEGIN PRIVATE KEY-----
    content message
    -----END PRIVATE KEY------
    opened by jamwu1991 1
  • Exceeded reconnect_retries seems seems not to be working

    Exceeded reconnect_retries seems seems not to be working

    I was looking for a way of checking if the reconnect_tries was exceeded and found this issue: https://github.com/wialon/gmqtt/issues/72 that was asking the same. It has a PR associated: https://github.com/wialon/gmqtt/pull/76

    The thing is I've tried the solution proposed with gmqtt==0.6.9 and on_disconnect is only called when the first disconnection happens...

    def on_disconnect(self, client: gmqtt.Client, packet: bytes, exc: None = None):
        if client.failed_connections > client.reconnect_retries:
        #    method that logs that the system couldn't reconnect...
    

    Thanks!

    opened by presedo93 1
  • [PROPERTIES] received invalid property id 105, disconnecting

    [PROPERTIES] received invalid property id 105, disconnecting

    I don't understand the code well enough to make sense of what I am seeing here, but I am sometimes getting exceptions thrown in MqttPackageHandler._handle_publish_packet() due to the returned value of properties from qttPackageHandler._parse_parameters() being None:

    [PROPERTIES] received invalid property id 105, disconnecting
    [ERROR HANDLE PKG]
    Traceback (most recent call last):
      File "/usr/local/lib/python3.7/dist-packages/gmqtt/mqtt/handler.py", line 389, in __call__
        result = self._handle_packet(cmd, packet)
      File "/usr/local/lib/python3.7/dist-packages/gmqtt/mqtt/handler.py", line 214, in _handle_packet
        handler(cmd, packet)
      File "/usr/local/lib/python3.7/dist-packages/gmqtt/mqtt/handler.py", line 326, in _handle_publish_packet
        properties['dup'] = dup
    TypeError: 'NoneType' object does not support item assignment
    2
    

    Looking at the code in _handle_connack_packet, a test is made for None and a call to self.disconnect() queued. But _handle_publish_packet() makes no such test, before assuming that properties is a Dict that can be assigned to.

    Should there be a test here leading to a disconnect (as elsewhere)? That the error message from _parse_parameters says "disconnecting" but then doesn't attempt to (depending on where it is called from) suggests this is a suitable fix but I don't know what the implications might be.

    opened by hollymcr 2
Releases(v0.6.11)
Owner
Gurtam
Gurtam
Nook is a simple, concatenative programming language written in Python.

Nook Nook is a simple, concatenative programming language written in Python. Status Nook is currently WIP. It lacks a lot of basic feature, and will n

Wumi4 4 Jul 20, 2022
This is a repository containing the backend and the frontend of a simple pokédex.

Pokémon This is a repository containing the backend and the frontend of a simple pokédex. This is a work in progress project! Project Structure 🗂 pok

André Rato 1 Nov 28, 2021
The learning agent learns firstly approaching to the football and then kicking the football to the target position

Football Court This project utilized Pytorch and Tensorflow so that the learning agent learns firstly approaching to the football and then kicking the

1 Nov 19, 2021
A frontend to ease the use of pulseaudio's routing capabilities, mimicking voicemeeter's workflow

Pulsemeeter A frontend to ease the use of pulseaudio's routing capabilities, mimicking voicemeeter's workflow Features Create virtual inputs and outpu

Gabriel Carneiro 164 Jan 04, 2023
A class to draw curves expressed as L-System production rules

A class to draw curves expressed as L-System production rules

Juna Salviati 6 Sep 09, 2022
Convert Beat Saber maps to Tesla light shows!

Tesla x Beat Saber - Light Show Converter Convert Beat Saber maps to Tesla light shows! This project requires FFMPEG and all packages from requirement

HLVM 20 Dec 21, 2022
A inspector to be able to view and edit Qt style sheet while an application is running

Qt Style Sheet Inspector An inspector widget to view and modify the style sheet of a Qt app at runtime. Usage In order to use the inspector widget on

ESSS 46 Dec 10, 2022
An app to help people apply for admissions on schools/hostels

Admission-helper About An app to help people apply for admissions on schools/hostels This app is a rewrite of Admission-helper-beta-v5.8.9 and I impor

Advik 3 Apr 24, 2022
"Hacking" the (Telekom) Zyxel GPON SFP module (PMG3000-D20B)

"Hacking" the (Telekom) Zyxel GPON SFP module (PMG3000-D20B) The SFP can be sour

Matthias Riegler 52 Jan 03, 2023
Allows you to purge all reply comments left by a user on a YouTube channel or video.

YouTube Spammer Purge Allows you to purge all reply comments left by a user on a YouTube channel or video. Purpose Recently, there has been a massive

4.3k Jan 09, 2023
To check my COVID-19 vaccine appointment, I wrote an infinite loop that sends me a Whatsapp message hourly using Twilio and Selenium. It works on my Raspberry Pi computer.

COVID-19_vaccine_appointment To check my COVID-19 vaccine appointment, I wrote an infinite loop that sends me a Whatsapp message hourly using Twilio a

Ayyuce Demirbas 24 Dec 17, 2022
Open Source Repository for CFD Solvers

Background and Validation This wiki is built in Notion. Here are all the tips you need to contribute. General Background Flow over a cylinder The proj

1 Dec 30, 2021
A package with multiple bias correction methods for climatic variables, including the QM, DQM, QDM, UQM, and SDM methods

A package with multiple bias correction methods for climatic variables, including the QM, DQM, QDM, UQM, and SDM methods

Sebastián A. Aedo Quililongo 9 Nov 18, 2022
Wrappers around the most common maya.cmds and maya.api use cases

Maya FunctionSet (maya_fn) A package that decompose core maya.cmds and maya.api features to a set of simple functions. Tests The recommended approach

Ryan Porter 9 Mar 12, 2022
Repository voor verhalen over de woningbouw-opgave in Nederland

Analyse plancapaciteit woningen In deze notebook zetten we cijfers op een rij om de woningbouwplannen van Nederlandse gemeenten in kaart te kunnen bre

Follow the Money 10 Jun 30, 2022
Hydralit package is a wrapping and template project to combine multiple independant Streamlit applications into a multi-page application.

Hydralit The Hydralit package is a wrapping and template project to combine multiple independant (or somewhat dependant) Streamlit applications into a

Jackson Storm 108 Jan 08, 2023
[Cython] Vs [Python] Which one is Faster ?

[Cython] Vs [Python] ? Attractive Contrast :) Mission : Which one is Faster ? Comparing of Execution runtime for [Selection_sort] with Time Complexity

baqer marani 1 Dec 05, 2021
This is a simple quizz which can ask user for login/register session, then consult to the Quiz interface.

SIMPLE-QUIZ- This is a simple quizz which can ask user for login/register session, then consult to the Quiz interface. By CHAKFI Ahmed MASTER SYSTEMES

CHAKFI Ahmed 1 Jan 10, 2022
Prometheus exporter for Spigot accounts

SpigotExporter Prometheus exporter for Spigot accounts What it provides SpigotExporter will output metrics for each of your plugins and a cumulative d

Jacob Bashista 5 Dec 20, 2021
scap is a tool for putting code in places and for other purposes

Scap is the deployment script used by Wikimedia Foundation to publish code and configuration on production web servers.

Wikimedia 7 Nov 02, 2022