mirror of
https://github.com/openhab/openhab-addons.git
synced 2025-01-10 07:02:02 +01:00
[gpio] GPIO Binding initial contribution (#1334)
* Added GPIO support Signed-off-by: Nils Bauer <nbauer@niba.tech>
This commit is contained in:
parent
9776de236f
commit
a02be787ee
@ -84,6 +84,7 @@
|
||||
/bundles/org.openhab.binding.generacmobilelink/ @digitaldan
|
||||
/bundles/org.openhab.binding.globalcache/ @mhilbush
|
||||
/bundles/org.openhab.binding.goecharger/ @SamuelBrucksch
|
||||
/bundles/org.openhab.binding.gpio/ @nils-bauer
|
||||
/bundles/org.openhab.binding.gpstracker/ @gbicskei
|
||||
/bundles/org.openhab.binding.gree/ @markus7017
|
||||
/bundles/org.openhab.binding.groheondus/ @FlorianSW
|
||||
|
@ -406,6 +406,11 @@
|
||||
<artifactId>org.openhab.binding.goecharger</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.openhab.addons.bundles</groupId>
|
||||
<artifactId>org.openhab.binding.gpio</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.openhab.addons.bundles</groupId>
|
||||
<artifactId>org.openhab.binding.gpstracker</artifactId>
|
||||
|
20
bundles/org.openhab.binding.gpio/NOTICE
Normal file
20
bundles/org.openhab.binding.gpio/NOTICE
Normal file
@ -0,0 +1,20 @@
|
||||
This content is produced and maintained by the openHAB project.
|
||||
|
||||
* Project home: https://www.openhab.org
|
||||
|
||||
== Declared Project Licenses
|
||||
|
||||
This program and the accompanying materials are made available under the terms
|
||||
of the Eclipse Public License 2.0 which is available at
|
||||
https://www.eclipse.org/legal/epl-2.0/.
|
||||
|
||||
== Source Code
|
||||
|
||||
https://github.com/openhab/openhab-addons
|
||||
|
||||
== Third-party Content
|
||||
|
||||
jpigpio
|
||||
* License: Apache License 2.0
|
||||
* Project: https://github.com/Xeli/jpigpio
|
||||
* Source: https://github.com/Xeli/jpigpio
|
88
bundles/org.openhab.binding.gpio/README.md
Normal file
88
bundles/org.openhab.binding.gpio/README.md
Normal file
@ -0,0 +1,88 @@
|
||||
# GPIO Binding
|
||||
|
||||
This binding adds GPIO support via the pigpio daemon to openhab.
|
||||
It requires the pigpio (http://abyz.me.uk/rpi/pigpio/) to be running on the pi that should be controlled.
|
||||
|
||||
## Supported Things
|
||||
|
||||
### pigpio-remote
|
||||
|
||||
This thing represents a remote pigpio instance running as daemon on a raspberry pi.
|
||||
|
||||
## Thing Configuration
|
||||
|
||||
### Pigpio Remote (`pigpio-remote`)
|
||||
|
||||
On a raspberry (or a compatible device) you have to install pigpio:
|
||||
|
||||
```
|
||||
sudo apt-get install pigpiod
|
||||
sudo raspi-config
|
||||
```
|
||||
|
||||
-> Interfacing Options --> Remote GPIO --> YES --> OK --> Finish
|
||||
|
||||
```
|
||||
sudo systemctl enable pigpiod
|
||||
sudo systemctl start pigpiod
|
||||
```
|
||||
|
||||
Set `host` to the address of the pi and the `port` to the port of pigpio (default: 8888).
|
||||
|
||||
## Channels
|
||||
|
||||
### Pigpio Remote
|
||||
|
||||
| channel | type | description |
|
||||
|-----------------------|--------|---------------------------------|
|
||||
| pigpio-digital-input | Switch | Read-only value of the gpio pin |
|
||||
| pigpio-digital-output | Switch | Controls the gpio pin |
|
||||
|
||||
### GPIO digital input channel
|
||||
|
||||
Set the number of the pin in `gpioId`.
|
||||
If you want to invert the value, set `invert` to true.
|
||||
To prevent incorrect change events, you can adjust the `debouncingTime`.
|
||||
|
||||
### GPIO digital output channel
|
||||
|
||||
Set the number of the pin in `gpioId`.
|
||||
If you want to invert the value, set `invert` to true.
|
||||
|
||||
## Full Example
|
||||
|
||||
|
||||
demo.things:
|
||||
|
||||
```
|
||||
Thing gpio:pigpio-remote:sample-pi-1 "Sample-Pi 1" [host="192.168.2.36", port=8888] {
|
||||
Channels:
|
||||
Type pigpio-digital-input : sample-input-1 [ gpioId=10]
|
||||
Type pigpio-digital-input : sample-input-2 [ gpioId=14, invert=true]
|
||||
Type pigpio-digital-output : sample-output-1 [ gpioId=3]
|
||||
}
|
||||
|
||||
Thing gpio:pigpio-remote:sample-pi-2 "Sample-Pi 2" [host="192.168.2.37", port=8888] {
|
||||
Channels:
|
||||
Type pigpio-digital-input : sample-input-3 [ gpioId=16, debouncingTime=20]
|
||||
Type pigpio-digital-input : sample-input-4 [ gpioId=17, invert=true, debouncingTime=5]
|
||||
Type pigpio-digital-output : sample-output-2 [ gpioId=4, invert=true]
|
||||
}
|
||||
```
|
||||
|
||||
demo.items:
|
||||
|
||||
```
|
||||
Switch SampleInput1 {channel="gpio:pigpio-remote:sample-pi-1:sample-input-1"}
|
||||
Switch SampleOutput1 {channel="gpio:pigpio-remote:sample-pi-1:sample-output-1"}
|
||||
```
|
||||
|
||||
demo.sitemap:
|
||||
|
||||
```
|
||||
sitemap demo label="Main Menu"
|
||||
{
|
||||
Switch item=SampleInput1
|
||||
Switch item=SampleOutput1
|
||||
}
|
||||
```
|
25
bundles/org.openhab.binding.gpio/pom.xml
Normal file
25
bundles/org.openhab.binding.gpio/pom.xml
Normal file
@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<parent>
|
||||
<groupId>org.openhab.addons.bundles</groupId>
|
||||
<artifactId>org.openhab.addons.reactor.bundles</artifactId>
|
||||
<version>3.1.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>org.openhab.binding.gpio</artifactId>
|
||||
|
||||
<name>openHAB Add-ons :: Bundles :: gpio Binding</name>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>eu.xeli</groupId>
|
||||
<artifactId>jpigpio_2.12</artifactId>
|
||||
<version>0.1.0</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
@ -0,0 +1,23 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
|
||||
Copyright (c) 2010-2021 Contributors to the openHAB project
|
||||
|
||||
See the NOTICE file(s) distributed with this work for additional
|
||||
information.
|
||||
|
||||
This program and the accompanying materials are made available under the
|
||||
terms of the Eclipse Public License 2.0 which is available at
|
||||
http://www.eclipse.org/legal/epl-2.0
|
||||
|
||||
SPDX-License-Identifier: EPL-2.0
|
||||
|
||||
-->
|
||||
<features name="org.openhab.binding.gpio-${project.version}" xmlns="http://karaf.apache.org/xmlns/features/v1.4.0">
|
||||
<repository>mvn:org.openhab.core.features.karaf/org.openhab.core.features.karaf.openhab-core/${ohc.version}/xml/features</repository>
|
||||
|
||||
<feature name="openhab-binding-gpio" description="GPIO Binding" version="${project.version}">
|
||||
<feature>openhab-runtime-base</feature>
|
||||
<bundle start-level="80">mvn:org.openhab.addons.bundles/org.openhab.binding.gpio/${project.version}</bundle>
|
||||
</feature>
|
||||
</features>
|
@ -0,0 +1,47 @@
|
||||
/**
|
||||
* Copyright (c) 2010-2021 Contributors to the openHAB project
|
||||
*
|
||||
* See the NOTICE file(s) distributed with this work for additional
|
||||
* information.
|
||||
*
|
||||
* This program and the accompanying materials are made available under the
|
||||
* terms of the Eclipse Public License 2.0 which is available at
|
||||
* http://www.eclipse.org/legal/epl-2.0
|
||||
*
|
||||
* SPDX-License-Identifier: EPL-2.0
|
||||
*/
|
||||
package org.openhab.binding.gpio.internal;
|
||||
|
||||
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||
import org.openhab.core.thing.ThingTypeUID;
|
||||
import org.openhab.core.thing.type.ChannelTypeUID;
|
||||
|
||||
/**
|
||||
* The {@link gpioBindingConstants} class defines common constants, which are
|
||||
* used across the whole binding.
|
||||
*
|
||||
* @author Nils Bauer - Initial contribution
|
||||
*/
|
||||
@NonNullByDefault
|
||||
public class GPIOBindingConstants {
|
||||
|
||||
private static final String BINDING_ID = "gpio";
|
||||
|
||||
public static final ThingTypeUID THING_TYPE_PIGPIO_REMOTE_THING = new ThingTypeUID(BINDING_ID, "pigpio-remote");
|
||||
|
||||
// List of all Thing Type UIDs
|
||||
public static final ChannelTypeUID CHANNEL_TYPE_DIGITAL_INPUT = new ChannelTypeUID(BINDING_ID,
|
||||
"pigpio-digital-input");
|
||||
public static final ChannelTypeUID CHANNEL_TYPE_DIGITAL_OUTPUT = new ChannelTypeUID(BINDING_ID,
|
||||
"pigpio-digital-output");
|
||||
|
||||
// Thing config properties
|
||||
public static final String HOST = "host";
|
||||
public static final String PORT = "port";
|
||||
public static final String INVERT = "invert";
|
||||
public static final String DEBOUNCING_TIME = "debouncing_time";
|
||||
public static final String STRICT_DEBOUNCING = "debouncing_strict";
|
||||
|
||||
// GPIO config properties
|
||||
public static final String GPIO_ID = "gpioId";
|
||||
}
|
@ -0,0 +1,56 @@
|
||||
/**
|
||||
* Copyright (c) 2010-2021 Contributors to the openHAB project
|
||||
*
|
||||
* See the NOTICE file(s) distributed with this work for additional
|
||||
* information.
|
||||
*
|
||||
* This program and the accompanying materials are made available under the
|
||||
* terms of the Eclipse Public License 2.0 which is available at
|
||||
* http://www.eclipse.org/legal/epl-2.0
|
||||
*
|
||||
* SPDX-License-Identifier: EPL-2.0
|
||||
*/
|
||||
package org.openhab.binding.gpio.internal;
|
||||
|
||||
import static org.openhab.binding.gpio.internal.GPIOBindingConstants.THING_TYPE_PIGPIO_REMOTE_THING;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||
import org.eclipse.jdt.annotation.Nullable;
|
||||
import org.openhab.binding.gpio.internal.handler.PigpioRemoteHandler;
|
||||
import org.openhab.core.thing.Thing;
|
||||
import org.openhab.core.thing.ThingTypeUID;
|
||||
import org.openhab.core.thing.binding.BaseThingHandlerFactory;
|
||||
import org.openhab.core.thing.binding.ThingHandler;
|
||||
import org.openhab.core.thing.binding.ThingHandlerFactory;
|
||||
import org.osgi.service.component.annotations.Component;
|
||||
|
||||
/**
|
||||
* The {@link gpioHandlerFactory} is responsible for creating things and thing
|
||||
* handlers.
|
||||
*
|
||||
* @author Nils Bauer - Initial contribution
|
||||
*/
|
||||
@NonNullByDefault
|
||||
@Component(configurationPid = "binding.gpio", service = ThingHandlerFactory.class)
|
||||
public class GPIOHandlerFactory extends BaseThingHandlerFactory {
|
||||
|
||||
private static final Set<ThingTypeUID> SUPPORTED_THING_TYPES_UIDS = Set.of(THING_TYPE_PIGPIO_REMOTE_THING);
|
||||
|
||||
@Override
|
||||
public boolean supportsThingType(ThingTypeUID thingTypeUID) {
|
||||
return SUPPORTED_THING_TYPES_UIDS.contains(thingTypeUID);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected @Nullable ThingHandler createHandler(Thing thing) {
|
||||
ThingTypeUID thingTypeUID = thing.getThingTypeUID();
|
||||
|
||||
if (thingTypeUID.equals(THING_TYPE_PIGPIO_REMOTE_THING)) {
|
||||
return new PigpioRemoteHandler(thing);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
/**
|
||||
* Copyright (c) 2010-2021 Contributors to the openHAB project
|
||||
*
|
||||
* See the NOTICE file(s) distributed with this work for additional
|
||||
* information.
|
||||
*
|
||||
* This program and the accompanying materials are made available under the
|
||||
* terms of the Eclipse Public License 2.0 which is available at
|
||||
* http://www.eclipse.org/legal/epl-2.0
|
||||
*
|
||||
* SPDX-License-Identifier: EPL-2.0
|
||||
*/
|
||||
package org.openhab.binding.gpio.internal;
|
||||
|
||||
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||
|
||||
/**
|
||||
* Is thrown when no gpio id is provided
|
||||
*
|
||||
* @author Nils Bauer - Initial contribution
|
||||
*/
|
||||
@NonNullByDefault
|
||||
public class NoGpioIdException extends Exception {
|
||||
private static final long serialVersionUID = -1281107134439928767L;
|
||||
}
|
@ -0,0 +1,35 @@
|
||||
/**
|
||||
* Copyright (c) 2010-2021 Contributors to the openHAB project
|
||||
*
|
||||
* See the NOTICE file(s) distributed with this work for additional
|
||||
* information.
|
||||
*
|
||||
* This program and the accompanying materials are made available under the
|
||||
* terms of the Eclipse Public License 2.0 which is available at
|
||||
* http://www.eclipse.org/legal/epl-2.0
|
||||
*
|
||||
* SPDX-License-Identifier: EPL-2.0
|
||||
*/
|
||||
package org.openhab.binding.gpio.internal.configuration;
|
||||
|
||||
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||
import org.eclipse.jdt.annotation.Nullable;
|
||||
|
||||
/**
|
||||
* The {@link GPIOConfiguration} class contains fields mapping thing configuration parameters.
|
||||
*
|
||||
* @author Nils Bauer - Initial contribution
|
||||
*/
|
||||
@NonNullByDefault
|
||||
public class GPIOConfiguration {
|
||||
|
||||
/**
|
||||
* The id of the gpio pin.
|
||||
*/
|
||||
public @Nullable Integer gpioId;
|
||||
|
||||
/**
|
||||
* Should the input/output be inverted?
|
||||
*/
|
||||
public boolean invert = false;
|
||||
}
|
@ -0,0 +1,28 @@
|
||||
/**
|
||||
* Copyright (c) 2010-2021 Contributors to the openHAB project
|
||||
*
|
||||
* See the NOTICE file(s) distributed with this work for additional
|
||||
* information.
|
||||
*
|
||||
* This program and the accompanying materials are made available under the
|
||||
* terms of the Eclipse Public License 2.0 which is available at
|
||||
* http://www.eclipse.org/legal/epl-2.0
|
||||
*
|
||||
* SPDX-License-Identifier: EPL-2.0
|
||||
*/
|
||||
package org.openhab.binding.gpio.internal.configuration;
|
||||
|
||||
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||
|
||||
/**
|
||||
* The {@link GPIOInputConfiguration} class contains fields mapping thing configuration parameters.
|
||||
*
|
||||
* @author Nils Bauer - Initial contribution
|
||||
*/
|
||||
@NonNullByDefault
|
||||
public class GPIOInputConfiguration extends GPIOConfiguration {
|
||||
/**
|
||||
* Time in ms to double check if value hasn't changed
|
||||
*/
|
||||
public int debouncingTime = 10;
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
/**
|
||||
* Copyright (c) 2010-2021 Contributors to the openHAB project
|
||||
*
|
||||
* See the NOTICE file(s) distributed with this work for additional
|
||||
* information.
|
||||
*
|
||||
* This program and the accompanying materials are made available under the
|
||||
* terms of the Eclipse Public License 2.0 which is available at
|
||||
* http://www.eclipse.org/legal/epl-2.0
|
||||
*
|
||||
* SPDX-License-Identifier: EPL-2.0
|
||||
*/
|
||||
package org.openhab.binding.gpio.internal.configuration;
|
||||
|
||||
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||
|
||||
/**
|
||||
* The {@link GPIOOutputConfiguration} class contains fields mapping thing configuration parameters.
|
||||
*
|
||||
* @author Nils Bauer - Initial contribution
|
||||
*/
|
||||
@NonNullByDefault
|
||||
public class GPIOOutputConfiguration extends GPIOConfiguration {
|
||||
|
||||
}
|
@ -0,0 +1,35 @@
|
||||
/**
|
||||
* Copyright (c) 2010-2021 Contributors to the openHAB project
|
||||
*
|
||||
* See the NOTICE file(s) distributed with this work for additional
|
||||
* information.
|
||||
*
|
||||
* This program and the accompanying materials are made available under the
|
||||
* terms of the Eclipse Public License 2.0 which is available at
|
||||
* http://www.eclipse.org/legal/epl-2.0
|
||||
*
|
||||
* SPDX-License-Identifier: EPL-2.0
|
||||
*/
|
||||
package org.openhab.binding.gpio.internal.configuration;
|
||||
|
||||
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||
import org.eclipse.jdt.annotation.Nullable;
|
||||
|
||||
/**
|
||||
* The {@link PigpioConfiguration} class contains fields mapping thing configuration parameters.
|
||||
*
|
||||
* @author Nils Bauer - Initial contribution
|
||||
*/
|
||||
@NonNullByDefault
|
||||
public class PigpioConfiguration {
|
||||
|
||||
/**
|
||||
* Network address of the raspberry pi
|
||||
*/
|
||||
public @Nullable String host;
|
||||
|
||||
/**
|
||||
* Port of pigpio on the remote raspberry pi
|
||||
*/
|
||||
public int port = 8888;
|
||||
}
|
@ -0,0 +1,28 @@
|
||||
/**
|
||||
* Copyright (c) 2010-2021 Contributors to the openHAB project
|
||||
*
|
||||
* See the NOTICE file(s) distributed with this work for additional
|
||||
* information.
|
||||
*
|
||||
* This program and the accompanying materials are made available under the
|
||||
* terms of the Eclipse Public License 2.0 which is available at
|
||||
* http://www.eclipse.org/legal/epl-2.0
|
||||
*
|
||||
* SPDX-License-Identifier: EPL-2.0
|
||||
*/
|
||||
package org.openhab.binding.gpio.internal.handler;
|
||||
|
||||
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||
import org.openhab.core.types.Command;
|
||||
|
||||
/**
|
||||
* The {@link ChannelHandler} provides an interface for different pin
|
||||
* configuration handlers
|
||||
*
|
||||
* @author Jan N. Klug - Initial contribution
|
||||
*/
|
||||
@NonNullByDefault
|
||||
public interface ChannelHandler {
|
||||
|
||||
void handleCommand(Command command);
|
||||
}
|
@ -0,0 +1,88 @@
|
||||
/**
|
||||
* Copyright (c) 2010-2021 Contributors to the openHAB project
|
||||
*
|
||||
* See the NOTICE file(s) distributed with this work for additional
|
||||
* information.
|
||||
*
|
||||
* This program and the accompanying materials are made available under the
|
||||
* terms of the Eclipse Public License 2.0 which is available at
|
||||
* http://www.eclipse.org/legal/epl-2.0
|
||||
*
|
||||
* SPDX-License-Identifier: EPL-2.0
|
||||
*/
|
||||
package org.openhab.binding.gpio.internal.handler;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||
import org.openhab.binding.gpio.internal.NoGpioIdException;
|
||||
import org.openhab.binding.gpio.internal.configuration.GPIOInputConfiguration;
|
||||
import org.openhab.core.library.types.OnOffType;
|
||||
import org.openhab.core.types.Command;
|
||||
import org.openhab.core.types.RefreshType;
|
||||
import org.openhab.core.types.State;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import eu.xeli.jpigpio.GPIO;
|
||||
import eu.xeli.jpigpio.JPigpio;
|
||||
import eu.xeli.jpigpio.PigpioException;
|
||||
|
||||
/**
|
||||
* Thing Handler for digital GPIO inputs.
|
||||
*
|
||||
* @author Nils Bauer - Initial contribution
|
||||
* @author Jan N. Klug - Channel redesign
|
||||
*/
|
||||
@NonNullByDefault
|
||||
public class PigpioDigitalInputHandler implements ChannelHandler {
|
||||
|
||||
private final Logger logger = LoggerFactory.getLogger(PigpioDigitalInputHandler.class);
|
||||
private Date lastChanged = new Date();
|
||||
|
||||
private final GPIOInputConfiguration configuration;
|
||||
private final GPIO gpio;
|
||||
private final Consumer<State> updateStatus;
|
||||
|
||||
public PigpioDigitalInputHandler(GPIOInputConfiguration configuration, JPigpio jPigpio,
|
||||
ScheduledExecutorService scheduler, Consumer<State> updateStatus)
|
||||
throws PigpioException, NoGpioIdException {
|
||||
this.configuration = configuration;
|
||||
this.updateStatus = updateStatus;
|
||||
Integer gpioId = configuration.gpioId;
|
||||
if (gpioId == null) {
|
||||
throw new NoGpioIdException();
|
||||
}
|
||||
gpio = new GPIO(jPigpio, gpioId, 1);
|
||||
jPigpio.gpioSetAlertFunc(gpio.getPin(), (gpio, level, tick) -> {
|
||||
lastChanged = new Date();
|
||||
Date thisChange = new Date();
|
||||
scheduler.schedule(() -> afterDebounce(thisChange), configuration.debouncingTime, TimeUnit.MILLISECONDS);
|
||||
});
|
||||
}
|
||||
|
||||
private void afterDebounce(Date thisChange) {
|
||||
try {
|
||||
// Check if value changed over time
|
||||
if (!thisChange.before(lastChanged)) {
|
||||
updateStatus.accept(OnOffType.from(configuration.invert != gpio.getValue()));
|
||||
}
|
||||
} catch (PigpioException e) {
|
||||
logger.warn("Unknown pigpio exception", e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleCommand(Command command) {
|
||||
if (command instanceof RefreshType) {
|
||||
try {
|
||||
updateStatus.accept(OnOffType.from(configuration.invert != gpio.getValue()));
|
||||
} catch (PigpioException e) {
|
||||
logger.warn("Unknown pigpio exception while handling Refresh", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,85 @@
|
||||
/**
|
||||
* Copyright (c) 2010-2021 Contributors to the openHAB project
|
||||
*
|
||||
* See the NOTICE file(s) distributed with this work for additional
|
||||
* information.
|
||||
*
|
||||
* This program and the accompanying materials are made available under the
|
||||
* terms of the Eclipse Public License 2.0 which is available at
|
||||
* http://www.eclipse.org/legal/epl-2.0
|
||||
*
|
||||
* SPDX-License-Identifier: EPL-2.0
|
||||
*/
|
||||
package org.openhab.binding.gpio.internal.handler;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||
import org.openhab.binding.gpio.internal.NoGpioIdException;
|
||||
import org.openhab.binding.gpio.internal.configuration.GPIOOutputConfiguration;
|
||||
import org.openhab.core.library.types.OnOffType;
|
||||
import org.openhab.core.types.Command;
|
||||
import org.openhab.core.types.RefreshType;
|
||||
import org.openhab.core.types.State;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import eu.xeli.jpigpio.GPIO;
|
||||
import eu.xeli.jpigpio.JPigpio;
|
||||
import eu.xeli.jpigpio.PigpioException;
|
||||
|
||||
/**
|
||||
* Thing Handler for digital GPIO outputs.
|
||||
*
|
||||
* @author Nils Bauer - Initial contribution
|
||||
* @author Jan N. Klug - Channel redesign
|
||||
*/
|
||||
@NonNullByDefault
|
||||
public class PigpioDigitalOutputHandler implements ChannelHandler {
|
||||
|
||||
/** The logger. */
|
||||
private final Logger logger = LoggerFactory.getLogger(PigpioDigitalOutputHandler.class);
|
||||
|
||||
private final GPIOOutputConfiguration configuration;
|
||||
private final GPIO gpio;
|
||||
private final Consumer<State> updateStatus;
|
||||
|
||||
/**
|
||||
* Constructor for PigpioDigitalOutputHandler
|
||||
*
|
||||
* @param configuration The channel configuration
|
||||
* @param jPigpio The jPigpio instance
|
||||
* @param updateStatus Is called when the state should be changed
|
||||
*
|
||||
* @throws PigpioException Can be thrown by Pigpio
|
||||
* @throws NoGpioIdException Is thrown when no gpioId is defined
|
||||
*/
|
||||
public PigpioDigitalOutputHandler(GPIOOutputConfiguration configuration, JPigpio jPigpio,
|
||||
Consumer<State> updateStatus) throws PigpioException, NoGpioIdException {
|
||||
this.configuration = configuration;
|
||||
this.updateStatus = updateStatus;
|
||||
Integer gpioId = configuration.gpioId;
|
||||
if (gpioId == null) {
|
||||
throw new NoGpioIdException();
|
||||
}
|
||||
this.gpio = new GPIO(jPigpio, gpioId, 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleCommand(Command command) {
|
||||
if (command instanceof RefreshType) {
|
||||
try {
|
||||
updateStatus.accept(OnOffType.from(configuration.invert != gpio.getValue()));
|
||||
} catch (PigpioException e) {
|
||||
logger.warn("Unknown pigpio exception while handling Refresh", e);
|
||||
}
|
||||
}
|
||||
if (command instanceof OnOffType) {
|
||||
try {
|
||||
gpio.setValue(configuration.invert != (OnOffType.ON.equals(command)));
|
||||
} catch (PigpioException e) {
|
||||
logger.warn("An error occured while changing the gpio value: {}", e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,111 @@
|
||||
/**
|
||||
* Copyright (c) 2010-2021 Contributors to the openHAB project
|
||||
*
|
||||
* See the NOTICE file(s) distributed with this work for additional
|
||||
* information.
|
||||
*
|
||||
* This program and the accompanying materials are made available under the
|
||||
* terms of the Eclipse Public License 2.0 which is available at
|
||||
* http://www.eclipse.org/legal/epl-2.0
|
||||
*
|
||||
* SPDX-License-Identifier: EPL-2.0
|
||||
*/
|
||||
package org.openhab.binding.gpio.internal.handler;
|
||||
|
||||
import static org.openhab.binding.gpio.internal.GPIOBindingConstants.CHANNEL_TYPE_DIGITAL_INPUT;
|
||||
import static org.openhab.binding.gpio.internal.GPIOBindingConstants.CHANNEL_TYPE_DIGITAL_OUTPUT;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||
import org.openhab.binding.gpio.internal.NoGpioIdException;
|
||||
import org.openhab.binding.gpio.internal.configuration.GPIOInputConfiguration;
|
||||
import org.openhab.binding.gpio.internal.configuration.GPIOOutputConfiguration;
|
||||
import org.openhab.binding.gpio.internal.configuration.PigpioConfiguration;
|
||||
import org.openhab.core.thing.*;
|
||||
import org.openhab.core.thing.binding.BaseThingHandler;
|
||||
import org.openhab.core.thing.type.ChannelTypeUID;
|
||||
import org.openhab.core.types.Command;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import eu.xeli.jpigpio.JPigpio;
|
||||
import eu.xeli.jpigpio.PigpioException;
|
||||
import eu.xeli.jpigpio.PigpioSocket;
|
||||
|
||||
/**
|
||||
* Remote pigpio Handler
|
||||
*
|
||||
* This bridge is used to control remote pigpio instances.
|
||||
*
|
||||
* @author Nils Bauer - Initial contribution
|
||||
* @author Jan N. Klug - Channel redesign
|
||||
*/
|
||||
@NonNullByDefault
|
||||
public class PigpioRemoteHandler extends BaseThingHandler {
|
||||
private final Logger logger = LoggerFactory.getLogger(PigpioRemoteHandler.class);
|
||||
private final Map<ChannelUID, ChannelHandler> channelHandlers = new HashMap<>();
|
||||
|
||||
/**
|
||||
* Instantiates a new pigpio remote bridge handler.
|
||||
*
|
||||
* @param thing the thing
|
||||
*/
|
||||
public PigpioRemoteHandler(Thing thing) {
|
||||
super(thing);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleCommand(ChannelUID channelUID, Command command) {
|
||||
ChannelHandler channelHandler = channelHandlers.get(channelUID);
|
||||
if (channelHandler != null) {
|
||||
channelHandler.handleCommand(command);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initialize() {
|
||||
PigpioConfiguration config = getConfigAs(PigpioConfiguration.class);
|
||||
String host = config.host;
|
||||
int port = config.port;
|
||||
JPigpio jPigpio;
|
||||
if (host == null) {
|
||||
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.OFFLINE.CONFIGURATION_ERROR,
|
||||
"Cannot connect to PiGPIO Service on remote raspberry. IP address not set.");
|
||||
return;
|
||||
}
|
||||
try {
|
||||
jPigpio = new PigpioSocket(host, port);
|
||||
updateStatus(ThingStatus.ONLINE);
|
||||
} catch (PigpioException e) {
|
||||
if (e.getErrorCode() == PigpioException.PI_BAD_SOCKET_PORT) {
|
||||
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.OFFLINE.CONFIGURATION_ERROR, "Port out of range");
|
||||
} else {
|
||||
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.OFFLINE.COMMUNICATION_ERROR,
|
||||
e.getLocalizedMessage());
|
||||
}
|
||||
return;
|
||||
}
|
||||
thing.getChannels().forEach(channel -> {
|
||||
ChannelUID channelUID = channel.getUID();
|
||||
ChannelTypeUID type = channel.getChannelTypeUID();
|
||||
try {
|
||||
if (CHANNEL_TYPE_DIGITAL_INPUT.equals(type)) {
|
||||
GPIOInputConfiguration configuration = channel.getConfiguration().as(GPIOInputConfiguration.class);
|
||||
channelHandlers.put(channelUID, new PigpioDigitalInputHandler(configuration, jPigpio, scheduler,
|
||||
state -> updateState(channelUID.getId(), state)));
|
||||
} else if (CHANNEL_TYPE_DIGITAL_OUTPUT.equals(type)) {
|
||||
GPIOOutputConfiguration configuration = channel.getConfiguration()
|
||||
.as(GPIOOutputConfiguration.class);
|
||||
channelHandlers.put(channelUID, new PigpioDigitalOutputHandler(configuration, jPigpio,
|
||||
state -> updateState(channelUID.getId(), state)));
|
||||
}
|
||||
} catch (PigpioException e) {
|
||||
logger.warn("Failed to initialize {}: {}", channelUID, e.getMessage());
|
||||
} catch (NoGpioIdException e) {
|
||||
logger.warn("Failed to initialize {}: GpioId is not set", channelUID);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<binding:binding id="gpio" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:binding="https://openhab.org/schemas/binding/v1.0.0"
|
||||
xsi:schemaLocation="https://openhab.org/schemas/binding/v1.0.0 https://openhab.org/schemas/binding-1.0.0.xsd">
|
||||
|
||||
<name>GPIO Binding</name>
|
||||
<description>Adds GPIO support to openHAB.</description>
|
||||
<author>Nils Bauer</author>
|
||||
|
||||
</binding:binding>
|
@ -0,0 +1,72 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<thing:thing-descriptions bindingId="gpio"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:thing="https://openhab.org/schemas/thing-description/v1.0.0"
|
||||
xsi:schemaLocation="https://openhab.org/schemas/thing-description/v1.0.0 https://openhab.org/schemas/thing-description-1.0.0.xsd">
|
||||
|
||||
<!-- PiGPIO Thing -->
|
||||
<thing-type id="pigpio-remote" extensible="pigpio-digital-input,pigpio-digital-output">
|
||||
<label>Pigpio Remote</label>
|
||||
<description>The remote pigpio thing represents a remote raspberry pi with pigpio installed. Pins are channels.</description>
|
||||
|
||||
<properties>
|
||||
<property name="vendor">Raspberry Pi Foundation</property>
|
||||
</properties>
|
||||
|
||||
<config-description>
|
||||
<parameter name="host" type="text">
|
||||
<context>network_address</context>
|
||||
<label>Network Address</label>
|
||||
<description>Network address of the Raspberry Pi.</description>
|
||||
</parameter>
|
||||
<parameter name="port" type="integer" min="0" max="65535">
|
||||
<context>port</context>
|
||||
<label>Port</label>
|
||||
<description>Port of pigpio on the remote Raspberry Pi.</description>
|
||||
<default>8888</default>
|
||||
</parameter>
|
||||
</config-description>
|
||||
</thing-type>
|
||||
|
||||
<channel-type id="pigpio-digital-input">
|
||||
<item-type>Switch</item-type>
|
||||
<label>GPIO Digital Input</label>
|
||||
<description>Get digital state of a GPIO Pin</description>
|
||||
<state readOnly="true"/>
|
||||
|
||||
<config-description>
|
||||
<parameter name="gpioId" type="integer" required="true">
|
||||
<label>GPIO Pin</label>
|
||||
<description>GPIO pin to use as input</description>
|
||||
</parameter>
|
||||
<parameter name="invert" type="boolean">
|
||||
<default>false</default>
|
||||
<label>Invert</label>
|
||||
</parameter>
|
||||
<parameter name="debouncingTime" type="integer" min="0">
|
||||
<context>time</context>
|
||||
<label>Delay Time</label>
|
||||
<description>Time in ms to double check if value hasn't changed</description>
|
||||
<default>10</default>
|
||||
<advanced>true</advanced>
|
||||
</parameter>
|
||||
</config-description>
|
||||
</channel-type>
|
||||
|
||||
<channel-type id="pigpio-digital-output">
|
||||
<item-type>Switch</item-type>
|
||||
<label>GPIO Digital Output</label>
|
||||
<description>Set digital state of a GPIO Pin</description>
|
||||
<config-description>
|
||||
<parameter name="gpioId" type="integer" required="true">
|
||||
<label>GPIO Pin</label>
|
||||
<description>GPIO pin to use as output</description>
|
||||
</parameter>
|
||||
<parameter name="invert" type="boolean">
|
||||
<default>false</default>
|
||||
<label>Invert</label>
|
||||
</parameter>
|
||||
</config-description>
|
||||
</channel-type>
|
||||
|
||||
</thing:thing-descriptions>
|
@ -114,6 +114,7 @@
|
||||
<module>org.openhab.binding.gce</module>
|
||||
<module>org.openhab.binding.generacmobilelink</module>
|
||||
<module>org.openhab.binding.goecharger</module>
|
||||
<module>org.openhab.binding.gpio</module>
|
||||
<module>org.openhab.binding.globalcache</module>
|
||||
<module>org.openhab.binding.gpstracker</module>
|
||||
<module>org.openhab.binding.gree</module>
|
||||
|
Loading…
Reference in New Issue
Block a user